"""
主程序
"""
import asyncio

import keyboard

#  导入模块

import cms_scan
from argparse import ArgumentParser
from banner import *
import port_scsan
import net_scan

if __name__ == '__main__':
    # 终端banner
    banner()
    # 创建选项对象
    parse = ArgumentParser('%prog -h help')
    # 添加选项
    general = parse.add_argument_group("通用命令")
    parse.add_argument('-m', '--model', dest='option', type=str, help='模式')
    cms = parse.add_argument_group("指纹识别模式 -m cms")
    general.add_argument('-u', '--url', dest='url', type=str, help='url地址/域名, 在进行C段扫描时，可以直接输入ip地址')
    cms.add_argument('-f',  '--file', dest='file', type=str, help='读取文件路径')
    port = parse.add_argument_group("端口扫描模式 -m port")
    general.add_argument('-s', '--save', dest='save_path', type=str, help='保存文件的路径和文件名，后缀不用写')
    port.add_argument('-t', '--thread', dest='thread', help='并发数 默认为20 最大为300', default=asyncio.Semaphore(20))
    port.add_argument('-p', '--port', dest='ports', nargs='+', type=int, help='扫描的端口，用空格隔开', default=None)
    port.add_argument('-i', '--ip', dest='ip', type=str, help='扫描的IP')
    port.add_argument('-a', '--all', dest='all', action='store_true', default=False, help='是否扫描所有端口')
    net = parse.add_argument_group("旁站/C段扫描模式 -m side")
    net.add_argument('-d', '--side', dest='is_side', action='store_true', default=False, help='是否扫描旁站')
    # 接收参数
    options = parse.parse_args()
    tool_option = options.option
    url = options.url
    th = options.thread
    file = options.file
    save_path = options.save_path
    ports = options.ports
    ip = options.ip
    all_port = options.all
    is_side = options.is_side

    # 实例化对象
    if tool_option == 'cms':
        res = cms_scan.WebCmsScan(url=url, filepath=file, save_path=save_path)
        res.scan_options()
    elif tool_option == 'port':
        res = port_scsan.PortScan(ip=ip, port=ports, is_all=all_port, semaphore=th, save_path=save_path)
        res.scan_options()
    elif tool_option == 'side':
        res = net_scan.IpScan(url=url, semaphore=th, side_station=is_side, save_path=save_path)
        res.scan_options()
